import os
from fastapi import APIRouter, UploadFile, File, Query, HTTPException, BackgroundTasks
from fastapi.responses import JSONResponse, FileResponse
from typing import List, Optional
import tempfile
import shutil
from pathlib import Path
import uuid

from archive_scanner import ArchiveScanner

router = APIRouter()

# 初始化扫描器
scanner = ArchiveScanner()

@router.post("/scan-file", response_model=dict)
async def scan_uploaded_archive(
    file: UploadFile = File(...),
    save2xlsx: bool = Query(False, description="是否保存为Excel文件(.xlsx格式)"),
    recursive: bool = Query(True, description="是否递归扫描目录中的所有文件和压缩包")
):
    """
    上传并扫描压缩包文件
    
    Args:
        file: 上传的压缩包文件
        save2xlsx: 是否保存为Excel文件(.xlsx格式)
        recursive: 是否递归处理嵌套压缩包
    
    Returns:
        包含文件列表的JSON响应或Excel文件下载链接
    """
    try:
        # 创建临时目录来存储上传的文件
        with tempfile.TemporaryDirectory() as temp_dir:
            # 保存上传的文件
            temp_file_path = os.path.join(temp_dir, file.filename)
            with open(temp_file_path, "wb") as buffer:
                shutil.copyfileobj(file.file, buffer)
            
            # 检查文件格式是否支持
            if not scanner.is_supported_format(temp_file_path):
                raise HTTPException(status_code=400, detail=f"不支持的文件格式: {file.filename}")
            
            # 扫描文件
            if recursive:
                files = scanner.get_recursive_contents(temp_file_path)
            else:
                files = scanner.get_archive_contents(temp_file_path)
            
            # 如果需要保存为Excel文件
            if save2xlsx:
                # 确保output_files目录存在
                output_dir = "output_files"
                if not os.path.exists(output_dir):
                    os.makedirs(output_dir)
                
                # 生成随机文件夹名
                random_folder = str(uuid.uuid4())
                random_folder_path = os.path.join(output_dir, random_folder)
                os.makedirs(random_folder_path)
                
                # 生成Excel文件路径
                output_file = os.path.join(random_folder_path, f"{Path(file.filename).stem}_contents.xlsx")
                scanner._write_to_excel(files, output_file)
                
                # 返回文件下载链接信息，直接指向文件路径
                file_url = f"http://localhost:8000/{output_file.replace(os.sep, '/')}"
                return JSONResponse(content={
                    "filename": file.filename,
                    "file_count": len(files),
                    "files": files,
                    "download_url": file_url
                })
            else:
                # 返回JSON响应
                return JSONResponse(content={
                    "filename": file.filename,
                    "file_count": len(files),
                    "files": files
                })
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"处理文件时出错: {str(e)}")

@router.get("/scan-path", response_model=dict)
async def scan_archive_path(
    path: str = Query(..., description="压缩包文件路径"),
    save2xlsx: bool = Query(False, description="是否保存为Excel文件(.xlsx格式)"),
    recursive: bool = Query(True, description="是否递归扫描目录中的所有文件和压缩包")
):
    """
    扫描指定路径的压缩包文件
    
    Args:
        path: 压缩包文件路径
        save2xlsx: 是否保存为Excel文件(.xlsx格式)
        recursive: 是否递归处理嵌套压缩包
    
    Returns:
        包含文件列表的JSON响应
    """
    try:
        # 检查文件是否存在
        if not os.path.exists(path):
            raise HTTPException(status_code=404, detail=f"文件不存在: {path}")
        
        # 检查文件格式是否支持
        if not scanner.is_supported_format(path):
            raise HTTPException(status_code=400, detail=f"不支持的文件格式: {path}")
        
        # 扫描文件
        if recursive:
            files = scanner.get_recursive_contents(path)
        else:
            files = scanner.get_archive_contents(path)
        
        # 如果需要保存为Excel文件
        if save2xlsx:
            # 确保output_files目录存在
            output_dir = "output_files"
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
            
            # 生成随机文件夹名
            random_folder = str(uuid.uuid4())
            random_folder_path = os.path.join(output_dir, random_folder)
            os.makedirs(random_folder_path)
                
            # 生成Excel文件路径
            output_file = os.path.join(random_folder_path, f"{Path(path).name}_contents.xlsx")
            scanner._write_to_excel(files, output_file)
            
            # 返回文件下载链接信息，直接指向文件路径
            file_url = f"http://localhost:8000/{output_file.replace(os.sep, '/')}"
            return JSONResponse(content={
                "filename": os.path.basename(path),
                "file_count": len(files),
                "files": files,
                "download_url": file_url
            })
        else:
            # 返回JSON响应
            return JSONResponse(content={
                "filename": os.path.basename(path),
                "file_count": len(files),
                "files": files
            })
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"处理文件时出错: {str(e)}")

@router.get("/formats", response_model=dict)
async def get_supported_formats():
    """
    获取支持的压缩包格式列表
    
    Returns:
        支持的格式列表
    """
    return JSONResponse(content={
        "supported_formats": scanner.supported_formats
    })

@router.get("/download/{filename}")
async def download_file(filename: str):
    """
    下载生成的Excel文件
    
    Args:
        filename: 要下载的文件名
    
    Returns:
        文件下载响应
    """
    try:
        # 构建完整的文件路径
        file_path = os.path.join("output_files", filename)
        
        # 检查文件是否存在
        if not os.path.exists(file_path):
            raise HTTPException(status_code=404, detail=f"文件不存在: {filename}")
        
        return FileResponse(
            path=file_path,
            filename=filename,
            media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"下载文件时出错: {str(e)}")